const char *babl_class_name (BablClassType klass);
+
+
#define BABL_DEFINE_CLASS(TypeName, type_name) \
\
void type_name##_init (void); \
+void type_name##_destroy (void); \
void type_name##_each (BablEachFunction each_fun, \
void *user_data); \
-void type_name##_destroy (void); \
TypeName * type_name (const char *name); \
TypeName * type_name##_id (int id); \
TypeName * type_name##_new (const char *name, \
...);
+
+#define BABL_DEFINE_CLASS_NO_NEW_NO_ID(TypeName, type_name) \
+ \
+void type_name##_init (void); \
+void type_name##_destroy (void); \
+void type_name##_each (BablEachFunction each_fun, \
+ void *user_data);
+
#endif
each_babl_fish_destroy (Babl *babl,
void *data)
{
- babl_free (babl->instance.name);
babl_free (babl);
return 0; /* continue iterating */
}
-static BablFish *
-fish_new (const char *name,
- int id,
- Babl *source,
- Babl *destination)
+BablFish *
+babl_fish_new (const char *name,
+ Babl *source,
+ Babl *destination)
{
BablFish *self = NULL;
self = babl_calloc (sizeof (BablFish), 1);
self->instance.type = BABL_FISH;
- self->instance.id = id;
- self->instance.name = babl_strdup (name);
+ self->instance.id = 0;
+ self->instance.name = "Fishy";
self->source = (union Babl*)source;
self->destination = (union Babl*)destination;
assert (BABL_IS_BABL (self->source));
assert (BABL_IS_BABL (self->destination));
-/* Might make sense to allow a precalculated shortcut to
- * participate in later checks for optimal conversions
-
- babl_add_ptr_to_list ((void ***)&(source->type.from), self);
- babl_add_ptr_to_list ((void ***)&(destination->type.to), self);
- */
-
- return (BablFish*)self;
-}
-
-BablFish *
-babl_fish_new (const char *name,
- ...)
-{
- va_list varg;
- BablFish *self;
-
- int id = 0;
- Babl *source = NULL;
- Babl *destination = NULL;
-
- const char *arg = name;
-
- va_start (varg, name);
-
- while (1)
- {
- arg = va_arg (varg, char *);
- if (!arg)
- break;
-
- else if (!strcmp (arg, "id"))
- {
- id = va_arg (varg, int);
- }
-
- else if (!strcmp (arg, "source"))
- {
- source = va_arg (varg, Babl*);
- }
- else if (!strcmp (arg, "destination"))
- {
- destination = va_arg (varg, Babl*);
- }
- else
- {
- babl_log ("%s(): unhandled parameter '%s' for pixel_format '%s'",
- __FUNCTION__, arg, name);
- exit (-1);
- }
- }
-
- va_end (varg);
-
- self = fish_new (name, id,
- source, destination);
-
if ((BablFish*) db_insert ( (Babl*)self) == self)
{
return self;
each_babl_fish_destroy ( (Babl*)self, NULL);
return NULL;
}
+
+/* Might make sense to allow a precalculated shortcut to
+ * participate in later checks for optimal conversions, then we
+ * should also have better generated names,. model + datatype
+ * is a possibility , or even full single line serialization of
+ * components with types.
+ *
+ babl_add_ptr_to_list ((void ***)&(source->type.from), self);
+ babl_add_ptr_to_list ((void ***)&(destination->type.to), self);
+ */
+ return (BablFish*)self;
}
BABL_CLASS_TEMPLATE(BablFish, babl_fish, "BablFish")
#define BABL_FISH_H
#include "babl-classes.h"
-BABL_DEFINE_CLASS(BablFish, babl_fish)
+
+BABL_DEFINE_CLASS_NO_NEW_NO_ID(BablFish, babl_fish)
+
+BablFish *
+babl_fish_new (Babl *source,
+ Babl *destination);
+
+/* babl_fish_process will probably be a polymorph function
+ * accepting source and destination buffer pointers will be
+ * allowed as well as BablImage objects in their place
+ */
+int
+babl_fish_process (BablFish *babl_fish,
+ void *source,
+ void *destination,
+ int n);
+
+/* whether the BablFish needs a BablImage to do the processing,
+ * or void * are sufficient.
+ */
+int
+babl_fish_needs_image (BablFish *babl_dish);
#endif